package cn.com.zero.manager.auth.mapper;

import cn.com.zero.api.auth.po.PermissionPO;
import cn.com.zero.common.auth.security.po.AuthUserPO;
import cn.com.zero.common.auth.security.po.LoginLogPO;
import cn.com.zero.api.auth.po.MenuPO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;

/**
 * @author guoxin
 * @version 1.0.0
 * @Description
 * @date 2023/3/31 14:39
 */
@Mapper
@Repository
public interface ILoginAuthenticationMapper {

    /**
     * 查询登录用户信息 BY 手机号(加密)
     *
     * @param mobile    手机号(加密)
     * @return  用户信息
     */
    AuthUserPO selectUserByMobile(String mobile);

    /**
     * 查询登录用户信息 BY 用户名称
     *
     * @param userName    用户名称
     * @return  用户信息
     */
    AuthUserPO selectUserByUserName(String userName);

    /**
     * 获取用户的用户权限PO
     *
     * @param userID    用户id
     * @return  用户信息
     */
    List<MenuPO> selectMenuByUserId(String userID);

    /**
     * 查询登录用户手机号(加密)是否存在
     *
     * @param userPO    用户信息
     * @return  用户信息
     */
    AuthUserPO isExistUserByMobile(@Param("userPO") AuthUserPO userPO);

    /**
     * 查询登录用户用户名是否存在
     *
     * @param userPO    用户信息
     * @return  用户信息
     */
    AuthUserPO isExistUserByUserName(@Param("userPO") AuthUserPO userPO);

    /**
     * 修改用户信息
     *
     * @param userPO        用户信息
     * @param showMobile    用户展示的手机号码
     */
    void modifyUserInfo(@Param("userPO") AuthUserPO userPO,
                        @Param("showMobile") String showMobile);

    /**
     * 删除用户登录失败信息
     *
     * @param userID    用户id
     */
    void DeleteErrorLogin(String userID);

    /**
     * 查找用户登陆日志信息
     *
     * @param userid    用户id
     * @return  用户登陆日志信息
     */
    LoginLogPO selectLoginLog(String userid);

    /**
     * 更新用户信息
     *
     * @param lastLoginTime 上次登录时间
     * @param lastLoginIP   上次登录IP
     * @param userID        用户id
     */
    void updateManager(@Param("lastLoginTime") Date lastLoginTime,
                       @Param("lastLoginIP") String lastLoginIP,
                       @Param("userID") String userID);

    /**
     * 添加登录日志
     *
     * @param loginLogPO    登录日志信息
     * @param logType       登录退出类型（0：登录  1：退出）
     * @param logStatus     操作结果：0：成功 1：失败
     * @param loginClient   登录设备：1：pc-web 2：android 3：ios 4：mobile-web
     */
    void addUserLoginLog(@Param("loginLogPO") LoginLogPO loginLogPO,
                         @Param("logType") String logType,
                         @Param("logStatus") Integer logStatus,
                         @Param("loginClient") Integer loginClient);

    /**
     * 获取用户登录错误次数
     *
     * @param userId    用户id
     * @return  用户登录错误次数
     */
    Integer getErrorLoginTimes(String userId);

    /**
     * 创建记录登录失败次数
     *
     * @param userID    用户id
     */
    void insertErrorLogin(String userID);

    /**
     * 更新记录登录失败次数
     *
     * @param userID    用户id
     * @param count     登录失败次数
     */
    void updateErrorLogin(@Param("userID") String userID,
                          @Param("count") Integer count);

    /**
     * 冻结用户
     *
     * @param userID    用户id
     */
    void freezeUser(String userID);

    /**
     * 查询公共权限
     *
     * @return  公共权限路径
     */
    List<PermissionPO> selectPublicPermission();

    /**
     * 查询需要登录公共权限
     *
     * @return  需要登录公共权限路径
     */
    List<PermissionPO> selectPublicPermissionIsLogin();
}
